package com.yanqu.road.server.manger.messagesubscribe;

import com.alibaba.fastjson.JSONObject;
import com.yanqu.road.entity.enums.eChannelType;
import com.yanqu.road.logic.config.ChannelConfig;
import com.yanqu.road.server.helper.SignHelper;
import com.yanqu.road.server.manger.ServerListMgr;
import com.yanqu.road.server.manger.messagesubscribe.enums.MessageSubscribeConfig;
import com.yanqu.road.utils.ConfigHelper;
import com.yanqu.road.utils.date.DateHelper;
import com.yanqu.road.utils.http.HttpHelper;
import com.yanqu.road.utils.string.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import static com.yanqu.road.server.helper.SignHelper.getParamMap;

/**
 * @Author : Cxp
 * @Time : 2024-08-28
 * @Description : 从MessageSubscribeMgr中独立出来，取代原有直接发送消息给微信的方法
 * 先将消息发送给37方，和抖音、支付宝的模式相同
 */

public class WxMessageSubscribe {
    private static final Logger logger = LogManager.getLogger(WxMessageSubscribe.class);

    private static final int gameId = 152; // 从sdk.login返回的game_id获取

    private static final String sign = "g_tX23pC9c2256ea,vy_58RPQR6AZ!r~"; // 密钥

    public static void sendMessageSubscribe(MessageSubscribeConfig templateConfig, String platformUserId, Object data, boolean isRetry) {
        if (!isSwitch()) {
            return;
        }
        if (templateConfig.getWxTemplateId().isEmpty() || platformUserId.isEmpty()) {
            return;
        }
        try {
            String url = ChannelConfig.WEIXIN_SEND_NOTICE_URL;
            if (url == null) {
                url = "https://gapih5.37.com/api/v1/wx/subscribeMessageSend";
            }

            JSONObject paramObj = new JSONObject();
            paramObj.put("game_id", gameId); // 37发行方游戏ID
            paramObj.put("uid", platformUserId); // 37发行方用户UID
            paramObj.put("template_id", templateConfig.getWxTemplateId()); // 一次性订阅/永久订阅模板ID
            paramObj.put("page", "index"); // 点击模板卡片后的跳转页面，仅限本小程序内的页面，index表示可跳转至小游戏页面
            paramObj.put("data", data == null ? "" : JSONObject.toJSONString(data)); // 模板内容，json格式字符串
            paramObj.put("miniprogram_state", "formal"); // 跳转小程序类型
            paramObj.put("lang", "zh_CN"); // 进入小程序查看的语言类型
            int now = DateHelper.getCurrentSecond();
            paramObj.put("time", now); // 秒级时间戳，误差允许10分钟内
            String signValue = SignHelper.getSign1(getParamMap(paramObj), sign);
            paramObj.put("sign", signValue); // 签名验证

            String result = HttpHelper.doPostJson(url, paramObj.toJSONString(), "UTF-8");
            if (StringUtils.isNullOrEmpty(result)) {
                logger.warn("发送微信订阅消息异常。 url:{}, paramObj:{}", url, paramObj.toJSONString());
                return;
            }
            logger.info("发送微信订阅消息 isRetry :{}, result:{}", isRetry, result);

            // 响应判断
            JSONObject resultObject = JSONObject.parseObject(result);
            int code = resultObject.getIntValue("code"); // 1代表响应成功（不代表消息推送成功），其它为失败
            String msg = resultObject.getString("message");
            if (code != 1) {
                logger.warn("发送微信订阅消息 {}  响应失败 templateId:{}, platformUserId:{},err_msg:{}", templateConfig.getGameTitle(), templateConfig.getWxTemplateId(), platformUserId, msg);
                return;
            }

            // 推送重试
            JSONObject ret = resultObject.getJSONObject("data");
            if (ret != null) {
                int err_no = ret.getIntValue("errcode"); // 0为推送成功，其余为失败
                if (err_no != 0 && !isRetry) { // 没有重试返回码，仅重试一次
                    sendMessageSubscribe(templateConfig, platformUserId, data, true);
                    return;
                }
                if (err_no != 0) {
                    String err_msg = ret.getString("errmsg");
                    logger.warn("发送微信订阅消息 {}  推送失败 templateId:{}, platformUserId:{},isRetry:{},err_no:{},err_msg:{}", templateConfig.getGameTitle(), templateConfig.getWxTemplateId(), platformUserId, true, err_no, err_msg);
                }
            }
        } catch (Exception err) {
            logger.error("发送微信订阅消息 templateId:{}, platformUserId:{}", templateConfig.getWxTemplateId(), platformUserId, err);
        }
    }

    /**
     * 是否开启这个功能
     * 判断渠道号、是否是正式环境
     *
     * @return boolean
     */
    public static boolean isSwitch() {
        long serverId = ConfigHelper.getLong("serverId");
        int channelId = ServerListMgr.getChannelId(serverId);

        return channelId == eChannelType.XiaoChengXu.getValue();
    }
}
